// 导入auth.js
import { getToken, setToken, removeToken } from '@/utils/auth'
// 导入userAPI
import { login, getUserInfoAPI, getUserDetailByIdAPI } from '@/api/user'
// 导入重置路由的方法
import { resetRouter } from '@/router/index'

export default {
  namespaced: true,
  state: {
    token: getToken() || null, // 获取token
    userInfo: {} // 初始化用户信息
  },
  mutations: {
  // 储存token
    setToken (state, token) {
      state.token = token
      setToken(token) // 存储token到本地
    },
    // 退出清除token
    delToken (state) {
      state.token = null
      removeToken() // 退出之后本地清除token
    },
    // 设置用户信息  (登录时)
    setUserInfo (state, payload) {
      state.userInfo = payload
    },
    // 清空用户信息   (退出时)
    delUserInfo (state) {
      state.userInfo = {}
    }
  },
  actions: {
    // 调用登录获取token的API
    async initToken(ctx, loginForm) {
      const res = await login(loginForm)
      console.log(res)
      ctx.commit('setToken', res)
    },
    // 调用获取用户信息的API
    async getUserInfo(ctx) {
      const res = await getUserInfoAPI()
      // 在调用获取用户信息的api的同时获取用户头像的API
      const userPhoto = await getUserDetailByIdAPI(res.userId)
      ctx.commit('setUserInfo', { ...res, ...userPhoto })
      return res
    },
    // 虽然没有退出登录的接口,但是模拟有退出登录接口的操作,所以在action中调用
    logout(context) {
      // 清除token
      context.commit('delToken')
      // 清除用户信息
      context.commit('delUserInfo')
      // 重置路由和清空菜单数据
      resetRouter()
      // 重置菜单数据,需要从评级的vuex调用state(menus.js)
      context.commit('menus/getRouterList', [], { root: true }) // { root: true }这个参数,可以让当前模块调用其他模块的方法
    }
  }
}

